global {
    objective toLeft(A, B)
    objective toLeft(B, C)
}

Map g x y, Map f p q {
    objective sameHeight(f, g)
}

Set X, Set Y {
    objective sameHeight(X, Y)
    constraint sameSizeAs(X, Y)
}

Set s {
    shape = Ellipse { 
      text = Auto
    }

    constraint outsideOf(s.shape.label, s)
    objective above(s, s.shape.label)
    objective sameX(s, s.shape.label)
    objective center(s)
}

Map f x y {
    shape = Text { 
      text = Auto
    }

    objective between(f, x, y)
    objective above(f, x)
}

Value f p q {
    shape = Arrow {
        start = p
        end   = q
        text = None
    }
}

Point p {
    shape = Dot { 
      text = None
    }

    -- objective centerLabel(p, p.shape.label)
}

In p s {
    constraint contains(s, p)
    objective sameX(p, s)
    objective sameHeight(p, s)
}

In p S, In q S {
    objective repel(p, q)
    objective sameX(p, q)
}
